home *** CD-ROM | disk | FTP | other *** search
/ A.C.E. 2 / ACE CD 2.iso / FILES / UTILS / GAMESDS3.DMS / GAMESDS3.adf / GDS_Examples.lha / Examples / Cyber_Flight / cyber_flight.c < prev    next >
C/C++ Source or Header  |  1994-11-14  |  11KB  |  326 lines

  1. /* Circuit Shootem Up - a GameSmith Demo.  AGA Enhanced! */
  2. /*
  3.    This program demonstrates use of AGA 7 bitplane dual playfield independent
  4.    scrolling (4 planes for playfield 1, and 3 for playfield 2).  I was gonna
  5.    use 8 bitplanes total, but any colors I added to the 2nd playfield just
  6.    detracted from the graphics.  I guess that's why I'm a programmer and
  7.    not a graphic artist. <grin>  The demo also uses a split screen as is
  8.    commonly found in many shoot'em up type games.  The bottom panel doesn't
  9.    do anything.  It's just there as an example.  -John Enright 4-15-94
  10.  
  11.    8-24-94 Enhanced to automatically scale down the 1st playfield so that the
  12.    demo will actually run on older machines.  The 1st playfield looks a little
  13.    goofy, but it does work.
  14.  
  15. */
  16.  
  17. #include <stdio.h>
  18. #include <stdlib.h>
  19. #include <string.h>
  20. #include <exec/memory.h>
  21. #include <exec/types.h>
  22. #include <graphics/gfx.h>
  23. #include <graphics/gfxbase.h>
  24.  
  25. #include <proto/exec.h>
  26. #include <proto/graphics.h>
  27. #include <proto/intuition.h>
  28.  
  29. #include "GameSmith:GameSmith.h"
  30. #include "GameSmith:include/proto/all_regargs.h"
  31. #include "GameSmith:include/libraries/libptrs.h"
  32.  
  33. #define BMWIDTH   640
  34. #define BMHEIGHT   400
  35.  
  36. #define PF1_PLANES   0x55;
  37. #define PF2_PLANES   0xaa;
  38. #define ALL_PLANES   0xff;
  39.  
  40. /*-------------------------------------------------------------------------*/
  41. /* Function Prototypes                                                      */
  42.  
  43. void scroll(void);
  44. int setup(void);
  45. int check_close(void);
  46. void cleanup(void);
  47.  
  48. /*-------------------------------------------------------------------------*/
  49. /* some global variables                                                   */
  50.  
  51. struct Interrupt *scroller=NULL;
  52. unsigned long color[48];
  53.  
  54. /*-------------------------------------------------------------------------*/
  55.  
  56. struct loadILBM_struct loadpic =
  57.    {
  58.    NULL,               /* ptr to picture name string */
  59.    NULL,               /* ptr to 1st bitmap */
  60.    NULL,               /* ptr to 2nd bitmap (if any) */
  61.    color,            /* ptr to color table array */
  62.    16,               /* # colors in color table */
  63.    NULL,               /* height of image in pixels (filled by load call) */
  64.    NULL,               /* width of image in pixels (filled) */
  65.    NULL,               /* x display offset (filled) */
  66.    NULL,               /* y display offset (filled) */
  67.    NULL,               /* pic mode (filled) */
  68.    0,                  /* x load offset (from left) in bytes */
  69.    0,                  /* y load offset (from top) in rows */
  70.    ILBM_COLOR,         /* flags (fill color table) */
  71.    0xff,               /* bitplane fill mask */
  72.    0xff,               /* bitplane load mask */
  73.    NULL               /* address of BitMapHeader to fill (none) */
  74.    };
  75.  
  76. struct gs_viewport vp2 =
  77.    {
  78.    NULL,                           /* ptr to next viewport */
  79.    &color[32],                     /* ptr to color table */
  80.    16,                           /* number of colors in table */
  81.    NULL,                           /* ptr to user copper list */
  82.    47,320,4,47,320,               /* height, width, depth, bmheight, bmwidth */
  83.    153,0,                        /* top & left viewport offsets */
  84.    0,0,                           /* X & Y bitmap offsets */
  85.    GSVP_ALLOCBM,                  /* flags (alloc bitmaps) */
  86.    NULL,NULL,                     /* 2.xx & above compatibility stuff */
  87.    NULL,NULL,                     /* bitmap pointers */
  88.    NULL,                           /* future expansion */
  89.    0,0,0,0                        /* display clip (MinX,MinY,MaxX,MaxY) */
  90.    };
  91.  
  92. struct gs_viewport vp =
  93.    {
  94.    &vp2,                           /* ptr to next viewport */
  95.    color,                        /* ptr to color table */
  96.    32,                           /* number of colors in table */
  97.    NULL,                           /* ptr to user copper list */
  98.    150,320,7,BMHEIGHT,BMWIDTH,   /* height, width, depth, bmheight, bmwidth */
  99.    0,0,                           /* top & left viewport offsets */
  100.    0,0,                           /* X & Y bitmap offsets */
  101.    GSVP_DPF|GSVP_ALLOCBM,          /* flags (dual playfield,alloc bitmaps) */
  102.    NULL,NULL,                     /* 2.xx & above compatibility stuff */
  103.    NULL,NULL,                     /* bitmap pointers */
  104.    NULL,                           /* future expansion */
  105.    0,0,0,0                        /* display clip (MinX,MinY,MaxX,MaxY) */
  106.    };
  107.  
  108. struct display_struct display =
  109.    {
  110.    NULL,                           /* ptr to previous display view */
  111.    NULL,NULL,                     /* 2.xx & above compatibility stuff */
  112.    0x87,0,                        /* X and Y display offsets (fix left offset) */
  113.    0,                              /* display mode ID */
  114.    4,4,                           /* sprite priorities */
  115.    GSV_SCROLLABLE|GSV_HARDX,      /* flags (scrollable) */
  116.    &vp,                           /* ptr to 1st viewport */
  117.    NULL                           /* future expansion */
  118.    };
  119.  
  120. /***************************************************************************/
  121.  
  122. main(argc,argv)
  123. int argc;
  124. char *argv[];
  125.  
  126. {
  127.    int err,end=0;
  128.  
  129.    if (gs_open_libs(DOS|GRAPHICS,0))   /* open AmigaDOS libs, latest versions */
  130.       exit(01);               /* if can't open libs, abort */
  131.    if (err=setup())            /* if couldn't get set up... abort program */
  132.       {
  133.       printf("\nSetup error: %d\n",err);
  134.       gs_close_libs();         /* close all libraries */
  135.       exit(02);
  136.       }
  137.    Forbid();                  /* take over the entire machine */
  138.    while (!end)               /* this shows off speed */
  139.       {
  140.       end=check_close();      /* end when user hits left mouse button */
  141.       }
  142.    Permit();                  /* OK, let other things run while we clean up */
  143.    cleanup();                  /* close & deallocate everything */
  144.    gs_close_libs();            /* close all libraries */
  145. }
  146.  
  147. /***************************************************************************/
  148.  
  149. void __interrupt __saveds scroll()
  150.  
  151. {
  152.    int stick,x=0,y=0,diff,velocity=2,x2,y2;
  153.    static int timer=0;
  154.    static int x_save=0,y_save=0;
  155.  
  156.    stick = _gs_joystick(1);
  157.    if (stick & (JOY_LEFT|JOY_RIGHT|JOY_UP|JOY_DOWN))
  158.       {
  159.       if (stick & JOY_BUTTON1)
  160.          velocity<<=1;
  161.       if (stick & JOY_LEFT)
  162.          x=velocity*-1;
  163.       else if (stick & JOY_RIGHT)
  164.          x=velocity;
  165.       if (stick & JOY_UP)
  166.          y=velocity*-1;
  167.       else if (stick & JOY_DOWN)
  168.          y=velocity;
  169.       timer=0;
  170.       }
  171.    else if (timer++ >= (60*5))               /* 5 second timeout */
  172.       {
  173.       x=x_save;
  174.       y=y_save;
  175.       if (!x_save)
  176.          {
  177.          x=_gs_random(3)+2;
  178.          if (_gs_random(100) < 50)
  179.             x*=-1;
  180.          x_save=x;
  181.          }
  182.       else if (_gs_random(1000) < 10)
  183.          {
  184.          x=_gs_random(3)+2;
  185.          if (_gs_random(100) < 50)
  186.             x*=-1;
  187.          x_save=x;
  188.          }
  189.       if (!y_save)
  190.          {
  191.          y=_gs_random(2)+2;
  192.          if (_gs_random(100) < 50)
  193.             y*=-1;
  194.          y_save=y;
  195.          }
  196.       else if (_gs_random(1000) < 10)
  197.          {
  198.          y=_gs_random(2)+2;
  199.          if (_gs_random(100) < 50)
  200.             y*=-1;
  201.          y_save=y;
  202.          }
  203.       }
  204.    if (x || y)
  205.       {
  206.       x2=x;
  207.       y2=y;
  208.       diff=vp.xoff+x;
  209.       if (diff < 0)
  210.          x=(BMWIDTH>>1)+x;
  211.       else if ((diff+vp.width) >= BMWIDTH)
  212.          x=-((BMWIDTH>>1)-x);
  213.       diff=vp.yoff+y;
  214.       if (diff < 0)
  215.          y=(BMHEIGHT>>1)+y;
  216.       else if ((diff+vp.height) >= BMHEIGHT)
  217.          y=-((BMHEIGHT>>1)-y);
  218.       gs_scroll_vp_pf1(&display,0,x,y,1);   /* scroll viewport 0, synchronize */
  219.       x=x2>>1;
  220.       y=y2>>1;
  221.       diff=vp.xoff2+x;
  222.       if (diff < 0)
  223.          x=(BMWIDTH>>1)+x;
  224.       else if ((diff+vp.width) >= BMWIDTH)
  225.          x=-((BMWIDTH>>1)-x);
  226.       diff=vp.yoff2+y;
  227.       if (diff < 0)
  228.          y=(BMHEIGHT>>1)+y;
  229.       else if ((diff+vp.height) >= BMHEIGHT)
  230.          y=-((BMHEIGHT>>1)-y);
  231.       gs_scroll_vp_pf2(&display,0,x,y,1);   /* scroll viewport 0, synchronize */
  232.       }
  233. }
  234.  
  235. /***************************************************************************/
  236.  
  237. int setup()
  238.  
  239. {
  240.    int chipset;
  241.  
  242.    chipset=gs_chiprev();
  243.    switch (chipset)         /* set hard left display offset depending on chipset */
  244.       {
  245.       case AGA_CHIPREV:
  246.          if (GfxBase->LibNode.lib_Version >= 36)   /* if WB 2.0 or higher */
  247.             display.DxOffset=0x87;
  248.          else
  249.             display.DxOffset=0;
  250.          break;
  251.       default:
  252.          if (GfxBase->LibNode.lib_Version >= 36)   /* if WB 2.0 or higher */
  253.             display.DxOffset=0x77;
  254.          else
  255.             display.DxOffset=0;
  256.          vp.depth=6;       /* if not AGA, max depth of 6 bitplanes */
  257.          break;
  258.       }
  259.    loadpic.bitmap1=NULL;   /* no bitmap to fill.  NOTE: this will cause an error return */
  260.    loadpic.bitmap2=NULL;   /* but the color table is still filled */
  261.    loadpic.file="gfx/pf1.pic";
  262.    gs_get_ILBM_bm(&loadpic);         /* get color table */
  263.    loadpic.file="gfx/pf2.pic";
  264.    if (chipset == AGA_CHIPREV)
  265.       loadpic.color_table=&color[16];   /* load 2nd playfield colors */
  266.    else
  267.       loadpic.color_table=&color[8];   /* load 2nd playfield colors */
  268.    loadpic.num_colors=16;            /* must reset after each load */
  269.    gs_get_ILBM_bm(&loadpic);         /* get color table */
  270.    loadpic.file="gfx/dashboard.brush";
  271.    loadpic.color_table=&color[32];   /* load 2nd viewport colors */
  272.    loadpic.num_colors=16;            /* must reset after each load */
  273.    gs_get_ILBM_bm(&loadpic);         /* get color table */
  274.    #ifdef NTSC_MONITOR_ID
  275.       display.modes = NTSC_MONITOR_ID;
  276.    #endif
  277.    if (gs_create_display(&display))
  278.       {
  279.       return(-1);
  280.       }
  281.    loadpic.flags=0;                  /* don't load color table */
  282.    loadpic.file="gfx/pf1.pic";
  283.    loadpic.bitmap1=vp.bitmap1;      /* address of bitmap to fill */
  284.    loadpic.fill=PF1_PLANES;
  285.    gs_loadILBM(&loadpic);            /* load the picture! */
  286.    loadpic.file="gfx/pf2.pic";
  287.    loadpic.fill=PF2_PLANES;
  288.    gs_loadILBM(&loadpic);            /* load the picture! */
  289.    loadpic.file="gfx/dashboard.brush";
  290.    loadpic.bitmap1=vp2.bitmap1;      /* address of bitmap to fill */
  291.    loadpic.fill=ALL_PLANES;;
  292.    gs_loadILBM(&loadpic);            /* load the picture! */
  293.    scroller=gs_add_vb_server(&scroll,0);
  294.    if (!scroller)
  295.       {
  296.       gs_remove_display(&display);
  297.       return(-2);
  298.       }
  299.    gs_show_display(&display,1);      /* show the display */
  300.    return(0);
  301. }
  302.  
  303. /***************************************************************************/
  304.  
  305. int check_close()
  306.  
  307. /* check for user input */
  308.  
  309. {
  310.    if (gs_joystick(0) & (JOY_BUTTON1|JOY_BUTTON2))
  311.       return(1);
  312.    return(0);
  313. }
  314.  
  315. /***************************************************************************/
  316.  
  317. void cleanup()
  318.  
  319. /* release all resources and memory */
  320.  
  321. {
  322.    if (scroller)
  323.       gs_remove_vb_server(scroller);
  324.    gs_remove_display(&display);
  325. }
  326.